#include <stdio.h>
#include <stdarg.h>

// define 中的 粘合运算符 ##
#define XNAME(n) x##n
// 当调用函数的时XNAME(4) 将会宏展开为"x4"

#define MYTYPE(X) _Generic((X), int                   \
                           : "int", double            \
                           : "double", float          \
                           : "float", long long int   \
                           : "long long int", default \
                           : "default")
//注意这里千万不能带";",不然进行宏替换会报错,还可以使用default关键字,指定默认返回的值

#define PR(...) printf(__VA_ARGS__)
// 三个点(...)需要配合__VA_ARGS__来使用,只能使用在 宏 的 参数列表中
// 即 #define DEFINED (...)
inline static void eatline()
{
    while (getchar() != '\n')
    {
        continue;
    }
};

int main(int argc, char const *argv[])
{
    int X;
    // _Generic是用于使用泛型编程用,是一个运算符,判断X为什么类型的值,返回列表中对应的值或参数
    int _generic = _Generic(X, int : 0, double : 1, float : 2, long long int : 3, char : 4);
    PR("_generic returns :%d\n", _generic);
    PR("MYTYPE returns %s: \n", MYTYPE(2.0 * X));
    PR("The file is %s\n", __FILE__);
    PR("The time is %s\n", __TIME__);
    PR("The line is %d\n", __LINE__);
    PR("The date is %s\n", __DATE__);
    PR("The stdc is %d\n", __STDC__);
    PR("The stdc_version is %d\n", __STDC_VERSION__);
    PR("The std_hosted is %d\n", __STDC_HOSTED__);
    // PR("The function is %s\n"__func__);
    PR("The line is %d\n", __LINE__);

    void (*eatlinePointer)() = &eatline;
    (*eatlinePointer)();
    return 0;
}

int myprintf(const char *formated_string, ...)
{
}